

/**
 *Clase que representa una cola utilizando una  lista simplemente encadenada o un arraylist
 * @param <E> permite que la lista sea generica
 * @author Alejo
 */
public class ImpleArray<E> extends QueueAbstract<E> {
    
private Nodo<E> head; // ref. to first element
/**
 * Constructor de una cola vacia.
 */
public ImpleArray(){
        head = null;
        cp = 0;
}

/**
 * Procedimiento que agrega un elemento al final de la cola y aunmenta el contador de elementos.
 * @param value Se envia como parametro el elemento que se desea agregar.
 */
@Override
    public void offer(E value) {
        Nodo<E> temp = new Nodo<E>(value,null);
        if (head != null){
            // pointer to possible tail
            Nodo<E> finger = head;
            while (finger.next() != null){
                finger = finger.next();
                        }
            finger.setNext(temp);
                    } 
        else head = temp;
                cp++;
    }

/**
 * Procedimiento que permite obtener el elemento que se encuentra al frente de la cola y lo remueve luego de la cola.
 * @return Devuele el elemento que se encuentra al inicio de la cola.
 */
@Override
    public E poll() {
        Nodo<E> temp = head;
        head = head.next(); // move head down list
        cp--;
        return temp.value();
    }

    /**
     * Procedimiento que permite obtener el elemento que se encuentra al inicio de la cola sin removerlo.
     * @return Devuelve el valor del primer elemento de la cola.
     */
    @Override
    public E peek() {
        return head.value();
    }
    
}
